package com.packet.cheng;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;

import java.util.Arrays;
import java.util.List;

/**
 @author zaicheng
 @version 1.0
 @date 2022-04-19
 @email zzc15847256473@163.com
 */

public class JedisTest {

    public static void main(String[] args) {

        JedisPoolConfig  jedisPoolConfig  = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);
        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMinIdle(5);
        // timeout,这里既是连接超时又是读写超时，从jedis2.8开始有区分connectionTimeout和soTimeout的构造函数
        JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.43.66",6379,3000,null);

        Jedis jedis = null;

        try {
            // 从redis的连接池里拿出一个链接执行命令
             jedis = jedisPool.getResource();

             // redis的普通操作示例
//            System.out.println(jedis.setex("jedisName",10,"zaicheng"));
//            System.out.println(jedis.get("jedisName"));

            // 管道示例：
            // 管道的命令执行方式：cat redis.txt | redis-cli -h 127.0.0.1 -a password -p 6379 --pipe
//            Pipeline pipeline = jedis.pipelined();
//            for (int i = 0; i < 10; i++){
//                pipeline.incr("pipelineKey");
//                pipeline.set("age"+i,"2"+i);
//
//                //模拟管道报错
//                //pipeline.setbit("age",-1,true);
//            }
//
//            List<Object> list = pipeline.syncAndReturnAll();
//            System.out.println(list);
            // ********lua脚本示例*******
            // 1.eval执行命令
            // 2.return之后的{KEYS[1],KEYS[2],ARGV[1]}代表参数
            // 3. 数字2 代表key的数量
            // 4.
            // eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
            // ====模拟一个商品减库存的原子操作====
            jedis.set("product_stock_10016","15"); //初始化商品为10016的库存
            String script = "local count = redis.call('get',KEYS[1])"+
                    "local a = tonumber(count)"+
                    "local b = tonumber(ARGV[1])"+
                    "if a > b then"+
                    "  redis.call('set',KEYS[1],a-b)"+
                    // 模拟语法报错回滚操作"  bb == 0 "+
                    "  return 1"+
                    " end "+
                    " return 0";
            Object obj = jedis.eval(script, Arrays.asList("product_stock_10016"), Arrays.asList("10"));
            System.out.println(obj);

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 注意这里不少关闭连接，在jedisPool模式下，Jedis会被归还给资源池
            if (jedis != null){
                jedis.close();
            }
        }
    }
}
